home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-11-08 | 13.1 KB | 633 lines | [TEXT/MPS ] |
- /*
- File: Collections.cpp
-
- Contains: Sample collection functions & classes
-
- Written by: Steve Smith
-
- Copyright: © 1995 by Apple Computer, Inc., all rights reserved.
-
- Description:
- CList: Generic unordered list
- COrderedList: Generic ordered list
- CFrameList: Unordered list of frames -
- frames automatically refcounted when
- added/removed from list.
- CQueue: Generic queue collection
- CStack: Generic stack collection
- */
-
-
- // -- Compiler/Preprocessor Switches --
-
- #ifndef _COMPILERDEFS_
- #include "CompDefs.h"
- #endif
-
- // -- OpenDoc Utilities --
-
- #ifndef _EXCEPT_
- // Exceptions define several important macros (ie. CHECKENV)
- // which are used in the SOM method dispatch glue. If Except.h
- // is not included early enough, exceptions may not be thrown
- // correctly when returning from a SOM method with "ev" parameter set.
- #include <Except.h>
- #endif
-
- // --- ListPart Includes ---
-
- #ifndef _SAMPLECOLLECTIONS_
- #include "SampleCollections.h"
- #endif
-
- // --- OpenDoc Includes ---
-
- #ifndef _ODTYPES_
- #include <ODTypes.h>
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include <Frame.xh>
- #endif
-
- #ifndef SOM_ODDraft_xh
- #include <Draft.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_Errors_defined
- #include <ErrorDef.h>
- #endif
-
- // --- OpenDoc Utilities ---
-
- #ifndef _ODDEBUG_
- #include <ODDebug.h>
- #endif
-
- #ifndef _ODNEW_
- #include <ODNew.h>
- #endif
-
- #ifndef _LINKLIST_
- #include <LinkList.h>
- #endif
-
- #ifndef _ODUTILS_
- #include <ODUtils.h>
- #endif
-
-
- //====================================================================
- // CFrameLink
- //====================================================================
-
- CFrameLink::CFrameLink(ODFrame* frame)
- :CGenericLink()
- {
- Environment* ev = somGetGlobalEnvironment();
- ODAcquireObject(ev, frame);
- fValue = (ODPtr)frame;
- }
-
- CFrameLink::~CFrameLink()
- {
- Environment* ev = somGetGlobalEnvironment();
- ODFrame* currentFrame = (ODFrame*)fValue;
- ODReleaseObject(ev, currentFrame);
- }
-
- ODFrame* CFrameLink::GetFrame()
- {
- return ((ODFrame*)fValue);
- }
-
- void CFrameLink::SetFrame(ODFrame* frame)
- {
- Environment* ev = somGetGlobalEnvironment();
- ODAcquireObject(ev, frame);
-
- ODFrame* currentFrame = (ODFrame*)fValue;
- ODReleaseObject(ev, currentFrame);
-
- fValue = (ODPtr)frame;
- }
-
- //====================================================================
- // CList
- //====================================================================
-
- ODBoolean CList::Contains(const ODPtr value)
- {
- if ( fList.IsEmpty() ) return kODFalse;
-
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- return kODTrue;
- }
-
- return kODFalse;
- }
-
- void CList::DeleteAllLinks()
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- delete (((CGenericLink*)link)->GetValue());
- }
- fList.RemoveAll();
- }
-
- void CList::Delete(ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- delete (((CGenericLink*)link)->GetValue());
- fList.Remove(*link);
- return;
- }
- }
- }
-
- void CList::Remove(ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- fList.Remove(*link);
- return;
- }
- }
- }
-
- void CList::Add(ODPtr value)
- {
- CGenericLink* link = new CGenericLink(value);
- fList.AddLast(link);
- }
-
-
- //====================================================================
- // CListIterator
- //====================================================================
-
- CListIterator::CListIterator(CList* list)
- {
- fIter = new LinkedListIterator(&list->fList);
- }
-
- CListIterator::~CListIterator()
- {
- delete fIter;
- }
-
- ODPtr CListIterator::First()
- {
- CGenericLink* link = (CGenericLink*) fIter->First();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr CListIterator::Next()
- {
- CGenericLink* link = (CGenericLink*) fIter->Next();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr CListIterator::Previous()
- {
- CGenericLink* link = (CGenericLink*) fIter->Previous();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr CListIterator::Last()
- {
- CGenericLink* link = (CGenericLink*) fIter->Last();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr CListIterator::Current()
- {
- CGenericLink* link = (CGenericLink*) fIter->Current();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODBoolean CListIterator::IsNotComplete()
- {
- return fIter->IsNotComplete();
- }
-
- void CListIterator::RemoveCurrent()
- {
- fIter->RemoveCurrent();
- }
-
- void CListIterator::DeleteCurrent()
- {
- CGenericLink* link = (CGenericLink*) fIter->Current();
- fIter->RemoveCurrent();
- if ( link ) {
- delete link->GetValue();
- delete link;
- }
- }
-
- //====================================================================
- // COrderedList
- //====================================================================
-
- ODBoolean COrderedList::Contains(const ODPtr value)
- {
- if ( fList.IsEmpty() ) return kODFalse;
-
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- return kODTrue;
- }
-
- return kODFalse;
- }
-
- ODUShort COrderedList::Position(const ODPtr value)
- {
- if ( fList.IsEmpty() ) return kListIsEmpty;
-
- ODUShort position = 0;
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- position++;
- if ( ((CGenericLink*)link)->GetValue() == value )
- return kODTrue;
- }
-
- return kItemNotFound;
- }
-
- void COrderedList::DeleteAllLinks()
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- delete (((CGenericLink*)link)->GetValue());
- }
- fList.RemoveAll();
- }
-
- void COrderedList::Delete(ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- delete (((CGenericLink*)link)->GetValue());
- fList.Remove(*link);
- return;
- }
- }
- }
-
- void COrderedList::Remove(ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- fList.Remove(*link);
- return;
- }
- }
- }
-
- ODPtr COrderedList::RemoveFirst()
- {
- CGenericLink* link = (CGenericLink*) fList.RemoveFirst();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr COrderedList::RemoveLast()
- {
- CGenericLink* link = (CGenericLink*) fList.RemoveLast();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
-
- void COrderedList::AddBefore(const ODPtr existing, ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == existing )
- {
- CGenericLink* newLink = new CGenericLink(value);
- fList.AddBefore(*link,newLink);
- return;
- }
- }
- }
-
- void COrderedList::AddAfter(const ODPtr existing, ODPtr value)
- {
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == existing )
- {
- CGenericLink* newLink = new CGenericLink(value);
- fList.AddAfter(*link,newLink);
- return;
- }
- }
- }
-
- void COrderedList::AddFirst(ODPtr value)
- {
- CGenericLink* link = new CGenericLink(value);
- fList.AddFirst(link);
- }
-
- void COrderedList::AddLast(ODPtr value)
- {
- CGenericLink* link = new CGenericLink(value);
- fList.AddLast(link);
- }
-
- ODPtr COrderedList::After(const ODPtr value) const
- {
- LinkedListIterator iter((LinkedList*)&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- Link* after = fList.After(*link);
- return (ODPtr)((CGenericLink*)after)->GetValue();
- }
- }
- return kODNULL;
- }
-
- ODPtr COrderedList::Before(const ODPtr value) const
- {
- LinkedListIterator iter((LinkedList*)&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ((CGenericLink*)link)->GetValue() == value )
- {
- Link* after = fList.Before(*link);
- return (ODPtr)((CGenericLink*)after)->GetValue();
- }
- }
- return kODNULL;
- }
-
- ODPtr COrderedList::First() const
- {
- CGenericLink* link = (CGenericLink*) fList.First();
- return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
- }
-
- ODPtr COrderedList::Last() const
- {
- CGenericLink* link = (CGenericLink*) fList.Last();
- return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
- }
-
-
- //====================================================================
- // CFrameList
- //====================================================================
-
- CFrameList::~CFrameList()
- {
- Environment* ev = somGetGlobalEnvironment();
-
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- iter.RemoveCurrent();
- delete link;
- }
- }
-
- ODBoolean CFrameList::Contains(const ODFrame* frame)
- {
- if ( fList.IsEmpty() ) return kODFalse;
-
- Environment* ev = somGetGlobalEnvironment();
-
- LinkedListIterator iter(&fList);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), (ODFrame*)frame) )
- return kODTrue;
- }
-
- return kODFalse;
- }
-
- void CFrameList::Remove(ODFrame* frame)
- {
- Environment* ev = somGetGlobalEnvironment();
- Link* link = kODNULL;
-
- LinkedListIterator iter(&fList);
- for ( link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), frame) )
- break;
- }
-
- fList.Remove(*link);
- delete link;
- }
-
- void CFrameList::Add(ODFrame* frame)
- {
- CFrameLink* link = new CFrameLink(frame);
- fList.AddLast(link);
- }
-
- ODFrame* CFrameList::GetFrame()
- {
- CFrameLink* link = (CFrameLink*) fList.First();
- return link->GetFrame();
- }
-
- //====================================================================
- // CFrameListIterator
- //====================================================================
-
- CFrameListIterator::CFrameListIterator(CFrameList* list)
- {
- fIter = new LinkedListIterator(&list->fList);
- }
-
- CFrameListIterator::~CFrameListIterator()
- {
- delete fIter;
- }
-
- ODFrame* CFrameListIterator::First()
- {
- CFrameLink* link = (CFrameLink*) fIter->First();
- return link ? link->GetFrame() : kODNULL;
- }
-
- ODFrame* CFrameListIterator::Next()
- {
- CFrameLink* link = (CFrameLink*) fIter->Next();
- return link ? link->GetFrame() : kODNULL;
- }
-
- ODFrame* CFrameListIterator::Previous()
- {
- CFrameLink* link = (CFrameLink*) fIter->Previous();
- return link ? link->GetFrame() : kODNULL;
- }
-
- ODFrame* CFrameListIterator::Last()
- {
- CFrameLink* link = (CFrameLink*) fIter->Last();
- return link ? link->GetFrame() : kODNULL;
- }
-
- ODFrame* CFrameListIterator::Current()
- {
- CFrameLink* link = (CFrameLink*) fIter->Current();
- return link ? link->GetFrame() : kODNULL;
- }
-
- ODBoolean CFrameListIterator::IsNotComplete()
- {
- return fIter->IsNotComplete();
- }
-
- void CFrameListIterator::ReleaseCurrent()
- {
- Environment* ev = somGetGlobalEnvironment();
-
- CFrameLink* link = (CFrameLink*) fIter->Current();
- if ( link )
- link->GetFrame()->Release(ev);
- fIter->RemoveCurrent();
- }
-
- //====================================================================
- // CStack
- //====================================================================
-
- void CStack::EmptyStack(ODBoolean deleteEntries)
- {
- if ( deleteEntries )
- {
- LinkedListIterator iter(&fStack);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- delete (((CGenericLink*)link)->GetValue());
- fStack.Remove(*link);
- }
- }
- else
- fStack.DeleteAllLinks();
- }
-
- ODUShort CStack::SetSize(ODUShort maxDepth)
- {
- ODULong curSize = fStack.Count();
-
- if ( curSize > maxDepth )
- fMaxDepth = (ODUShort) curSize;
- else
- fMaxDepth = maxDepth;
-
- return fMaxDepth;
- }
-
- ODBoolean CStack::PushEntry(ODPtr entry)
- {
- if ( (ODUShort)fStack.Count() < fMaxDepth )
- {
- CGenericLink* link = new CGenericLink(entry);
- fStack.AddFirst(link);
- return kODTrue;
- }
- else
- return kODFalse;
- }
-
- ODPtr CStack::PopEntry()
- {
- if ( fStack.IsEmpty() )
- return kODNULL;
- else
- {
- CGenericLink* link = (CGenericLink*)fStack.RemoveFirst();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
- }
-
-
- //====================================================================
- // CQueue
- //====================================================================
-
- void CQueue::EmptyQueue(ODBoolean deleteEntries)
- {
- if ( deleteEntries )
- {
- LinkedListIterator iter(&fQueue);
- for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
- {
- delete (((CGenericLink*)link)->GetValue());
- fQueue.Remove(*link);
- }
- }
- else
- fQueue.DeleteAllLinks();
- }
-
- ODUShort CQueue::SetSize(ODUShort maxEntries)
- {
- ODULong curSize = fQueue.Count();
-
- if ( curSize > maxEntries )
- fMaxEntries = (ODUShort) curSize;
- else
- fMaxEntries = maxEntries;
-
- return fMaxEntries;
- }
-
- ODBoolean CQueue::AddEntry(ODPtr entry)
- {
- if ( (ODUShort)fQueue.Count() < fMaxEntries )
- {
- CGenericLink* link = new CGenericLink(entry);
- fQueue.AddLast(link);
- return kODTrue;
- }
- else
- return kODFalse;
- }
-
- ODPtr CQueue::GetEntry()
- {
- if ( fQueue.IsEmpty() )
- return kODNULL;
- else
- {
- CGenericLink* link = (CGenericLink*)fQueue.RemoveFirst();
- return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
- }
- }
-
-